using System.Collections.Generic;
using System.Linq;

namespace PKGames.Utils
{
	public abstract class MappedList<T> where T : MappableObject
	{
		private Dictionary<string, T> _mappedList;

		protected abstract List<T> UnmappedList
		{
			get;
		}

		public Dictionary<string, T> MappedDictionary
		{
			get
			{
				if (_mappedList == null)
				{
					_mappedList = UnmappedList.ToDictionary((T mappableObject) => mappableObject.Id, (T mappableObject) => mappableObject);
				}
				return _mappedList;
			}
		}

		private void Add(T mappedObject)
		{
			if (!MappedDictionary.ContainsKey(mappedObject.Id))
			{
				UnmappedList.Add(mappedObject);
				MappedDictionary[mappedObject.Id] = mappedObject;
			}
		}

		private void Remove(string id)
		{
			if (!MappedDictionary.ContainsKey(id))
			{
				return;
			}
			int num = UnmappedList.FindIndex((T mappedObject) => mappedObject.Id == id);
			if (num >= 0)
			{
				UnmappedList.RemoveAt(num);
				if (MappedDictionary != null)
				{
					MappedDictionary.Remove(id);
				}
			}
		}

		public void Update(T mappedObject)
		{
			Remove(mappedObject.Id);
			Add(mappedObject);
		}
	}
}
